/*
SINACOR - BMF&Bovespa
Arquivo: AlocacaoProprietaria.cs
Criado em: 01-jun-2010 09:19:04
Arquiteto Responsavel: p-Ksantos
*/
using System;
using System.Collections.Generic;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using System.Text;
using System.Data.Common;
using System.Data;
using Sinacor.Infra.Service.Common;


namespace Sinacor.Servico.Bovespa.Alocacao.ResourceAccess
{
    /// <summary>
    /// Acesso a dados de Alocacao Proprietaria
    /// </summary>
    public class AlocacaoProprietaria : BaseResourceAccess
    {
        #region Construtor

        /// <summary>
        /// Construtor AlocacaoProprietaria
        /// </summary>
        public AlocacaoProprietaria()
            : base(AuthorizationContext.Current.CompanyId)
        {
        }

        #endregion

        #region Metodos

        #region AtualizarOcorrenciaNegocioDistribuido
        /// <summary>
        /// Atualiza quantidade na tabela TORNEGD.
        /// </summary>
        /// <param name="entity"></param>
        public Int32 AtualizarOcorrenciaNegocioDistribuido(BusinessEntity.Ocorrencia entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine(@"UPDATE TORNEGD SET 
                             QT_NEGOCIO = :QuantidadeNegocio - :Quantidade, 
                             DT_SISTEMA = CURRENT_TIMESTAMP                             
                             WHERE 
                             NR_NEGOCIO = :Negocio 
                             AND CD_NATOPE = :NaturezaOperacao 
                             AND DT_PREGAO = :DataNegocio 
                             AND CD_BOLSAMOV = :Bolsa ");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "QuantidadeNegocio", DbType.Decimal, entity.QuantidadeNegocio);
                this.DataBase.AddInParameter(command, "Quantidade", DbType.Decimal, entity.Quantidade);
                this.DataBase.AddInParameter(command, "Negocio", DbType.Int32, entity.Negocio);
                this.DataBase.AddInParameter(command, "NaturezaOperacao", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.NaturezaOperacao>(entity.NaturezaOperacao));
                this.DataBase.AddInParameter(command, "DataNegocio", DbType.DateTime, entity.DataNegocio);
                this.DataBase.AddInParameter(command, "Bolsa", DbType.String, entity.Bolsa);

                return this.DataBase.ExecuteNonQuery(command);
            }
        }
        #endregion

        #region ConsultarOcorrenciasCentralDepositaria
        /// <summary>
        /// Disponibiliza uma lista de ocorrencias Ze com Ze de arquivos importados da Central Depositaria.
        /// </summary>
        /// <param name="entity"></param>
        public List<BusinessEntity.Ocorrencia> ConsultarOcorrenciasCentralDepositaria(BusinessEntity.Parameter.FiltroOcorrenciaCentralDepositaria entity)
        {
            StringBuilder sql = new StringBuilder();
            List<BusinessEntity.Ocorrencia> listaOcorrencia = null;

            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                sql.AppendLine(@"SELECT 
                                    COMI.DT_DATORD DataOrdem, 
                                    COMI.NR_SEQORD Ordem, 
                                    COMI.NR_SUBSEQ SequenciaOrdem,
                                    NEGCOM.COD_NEG Ativo,
                                    'C' NaturezaOperacao,
                                    NEGCOM.NUM_NEG Negocio,
                                    COMI.DV_NEGOCIO DigitoNegocio,
                                    NEGCOM.DATA_NEG DataNegocio,
                                    NEGCOM.QTE_ACAO_CPA Quantidade,
                                    COMI.CD_BOLSAMOV Bolsa,
                                    COMI.DT_DATMOV DataMovimento,
                                    NEGCOM.COD_CLI_COMP CodigoCliente,
                                    COMI.DV_CLIENTE DigitoCliente,
                                    COMI.CD_CLIENTE_BRO CodigoClienteBroker,
                                    COMI.DV_CLIENTE_BRO DigitoClienteBroker,
                                    COMI.CD_CLIENTE_FIN CodigoClienteFinanceiro,
                                    COMI.DV_CLIENTE_FIN DigitoClienteFinanceiro,
                                    COMI.CD_CARLIQ CodigoCarteiraLiquidacao,
                                    COMI.PC_REDACR PercentualReducaoAcrescimo,
			                        COMI.IN_ORIGER GerouRegistro,
			                        NEGCOM.VAL_COT_PAP Preco,
			                        NVL(COMI.CD_USUFIM, 0) UsuarioDirecionado,
			                        NVL(COMI.CD_CLIFIM, 0) ClienteDirecionado,
			                        NEGD.CD_CONTRAPARTE Contraparte,
			                        NEGD.CD_OPERA_MEGA Porta,
			                        (SELECT CD_LOGIN FROM TGEUSUARIO WHERE CD_USUARIO = NEGCOM.COD_USUA_COMP) Operador,
			                        NEGCOM.NUM_CPF_CNPJ_CLI CNPJCPF,
			                        CLIBOL.NM_APELIDO Apelido,
			                        COMI.QT_QTDESP QuantidadeNegocio,
			                        NEGCOM.IND_CANC_NEG Cancelado,
			                        NVL2((SELECT NUM_PRTA_INIC_FAIX FROM TBOCTRL_PRTA_OCOR_ZECZE CONTPOR WHERE NEGD.CD_OPERA_MEGA 
                                    BETWEEN CONTPOR.NUM_PRTA_INIC_FAIX AND CONTPOR.NUM_PRTA_FIM_FAIX), 'S', 'N') ControlePorta,
			                        NEGD.HH_NEGOCIO HoraNegocio,
			                        COMI.IN_HOMEBROKER HomeBroker,
			                        NEGD.IN_ORINEG Origem,
			                        NEGD.TP_MERCADO Mercado,
			                        COMI.IN_CORRESP IndicadorCorrespondente,
			                        DECODE(COMI.QT_QTDESP - NEGCOM.QTE_ACAO_CPA, 0, 'N', 'S') QuantidadeDiferenteNegocio,
                                    NEGD.CD_CODCAS CodigoCasamento 
                                 FROM 
			                        ABONEG_ZECZE NEGCOM,
			                        TORNEGD NEGD,
			                        TORCOMI COMI,
			                        TORMOVD MOVD,
			                        TSCCLIBOL CLIBOL 
			                     WHERE 
			                        NEGCOM.DATA_NEG = :DataPregao1
			                        AND NEGCOM.DATA_NEG = NEGD.DT_PREGAO
			                        AND NEGCOM.COD_NEG = NEGD.CD_NEGOCIO
			                        AND NEGCOM.NUM_NEG = NEGD.NR_NEGOCIO
			                        AND NEGD.CD_NATOPE = 'C'
			                        AND NEGCOM.COD_CLI_COMP = COMI.CD_CLIENTE
			                        AND NEGCOM.DATA_NEG = COMI.DT_NEGOCIO
			                        AND NEGCOM.COD_NEG = COMI.CD_NEGOCIO
			                        AND NEGCOM.NUM_NEG = COMI.NR_NEGOCIO
			                        AND COMI.CD_NATOPE = 'C'
			                        AND COMI.DT_DATORD = MOVD.DT_DATORD
			                        AND COMI.NR_SEQORD = MOVD.NR_SEQORD
			                        AND COMI.NR_SUBSEQ = MOVD.NR_SUBSEQ
			                        AND MOVD.CD_CLIENTE = CLIBOL.CD_CLIENTE ");

                sql.AppendLine(string.Format("AND {0}", new Sinacor.Servico.Bovespa.Acesso.ResourceAccess.Acesso().ConsultarListaAssessores("CLIBOL.CD_ASSESSOR", 0, 9999999)));

                this.DataBase.AddInParameter(command, "DataPregao1", DbType.DateTime, entity.DataPregao);

                //Filtros Opcionais
                if (!string.IsNullOrEmpty(entity.Ativo))
                {
                    sql.AppendLine("AND RTRIM(NEGCOM.COD_NEG) = RTRIM(:Ativo) ");
                    this.DataBase.AddInParameter(command, "Ativo", DbType.String, entity.Ativo);
                }

                if (entity.Negocio.HasValue
                    && entity.Negocio.HasValue)
                {
                    sql.AppendLine("AND NEGCOM.NUM_NEG = :Negocio ");
                    this.DataBase.AddInParameter(command, "Negocio", DbType.Int32, entity.Negocio);
                }

                if (entity.ExcluirDiscricionariasDist.HasValue
                    && entity.ExcluirDiscricionariasDist.Value)
                {
                    sql.AppendLine("AND INSTR(MOVD.TP_ORDEM, '4', 1, 1) = 0 AND MOVD.IN_DISTRIB <> 'N' ");
                }

                sql.AppendLine(@"UNION ALL 
                                 SELECT 
                                    COMI.DT_DATORD DataOrdem,
                                    COMI.NR_SEQORD Ordem,
                                    COMI.NR_SUBSEQ SequenciaOrdem,
                                    NEGVEN.COD_NEG Ativo,
                                    'V' NaturezaOperacao,
                                    NEGVEN.NUM_NEG Negocio,
                                    COMI.DV_NEGOCIO DigitoNegocio,
                                    NEGVEN.DATA_NEG DataNegocio,
                                    NEGVEN.QTE_ACAO_VDA Quantidade,
                                    COMI.CD_BOLSAMOV Bolsa,
                                    COMI.DT_DATMOV DataMovimento,
                                    NEGVEN.COD_CLI_VEND CodigoCliente,
                                    COMI.DV_CLIENTE DigitoCliente,
                                    COMI.CD_CLIENTE_BRO CodigoClienteBroker,
                                    COMI.DV_CLIENTE_BRO DigitoClienteBroker,
                                    COMI.CD_CLIENTE_FIN CodigoClienteFinanceiro,
                                    COMI.DV_CLIENTE_FIN DigitoClienteFinanceiro,
                                    COMI.CD_CARLIQ CodigoCarteiraLiquidacao,
                                    COMI.PC_REDACR PercentualReducaoAcrescimo,
                                    COMI.IN_ORIGER GerouRegistro,
                                    NEGVEN.VAL_COT_PAP Preco,
                                    NVL(COMI.CD_USUFIM, 0) UsuarioDirecionado,
			                        NVL(COMI.CD_CLIFIM, 0) ClienteDirecionado,
			                        NEGD.CD_CONTRAPARTE Contraparte,
			                        NEGD.CD_OPERA_MEGA Porta,
			                        (SELECT CD_LOGIN FROM TGEUSUARIO WHERE CD_USUARIO = NEGVEN.COD_USUA_VEND) Operador,
			                        NEGVEN.NUM_CPF_CNPJ_CLI CNPJCPF,
			                        CLIBOL.NM_APELIDO Apelido,
			                        COMI.QT_QTDESP QuantidadeNegocio,
			                        NEGVEN.IND_CANC_NEG Cancelado,
			                        NVL2((SELECT NUM_PRTA_INIC_FAIX FROM TBOCTRL_PRTA_OCOR_ZECZE CONTPOR WHERE NEGD.CD_OPERA_MEGA 
                                    BETWEEN CONTPOR.NUM_PRTA_INIC_FAIX AND CONTPOR.NUM_PRTA_FIM_FAIX), 'S', 'N') ControlePorta,
			                        NEGD.HH_NEGOCIO HoraNegocio,
			                        COMI.IN_HOMEBROKER HomeBroker,
			                        NEGD.IN_ORINEG Origem,
			                        NEGD.TP_MERCADO Mercado,
			                        COMI.IN_CORRESP IndicadorCorrespondente,
			                        DECODE(COMI.QT_QTDESP - NEGVEN.QTE_ACAO_VDA, 0, 'N', 'S') QuantidadeDiferenteNegocio,
                                    NEGD.CD_CODCAS CodigoCasamento 
                                 FROM 
			                        ABONEG_ZECZE NEGVEN,
			                        TORNEGD NEGD,
			                        TORCOMI COMI,
			                        TORMOVD MOVD,
			                        TSCCLIBOL CLIBOL 
			                     WHERE 
                                    NEGVEN.DATA_NEG = :DataPregao2
			                        AND NEGVEN.DATA_NEG = NEGD.DT_PREGAO
			                        AND NEGVEN.COD_NEG = NEGD.CD_NEGOCIO
			                        AND NEGVEN.NUM_NEG = NEGD.NR_NEGOCIO
			                        AND NEGD.CD_NATOPE = 'V'
			                        AND NEGVEN.COD_CLI_VEND = COMI.CD_CLIENTE
			                        AND NEGVEN.DATA_NEG = COMI.DT_NEGOCIO
			                        AND NEGVEN.COD_NEG = COMI.CD_NEGOCIO
			                        AND NEGVEN.NUM_NEG = COMI.NR_NEGOCIO
			                        AND COMI.CD_NATOPE = 'V'
			                        AND COMI.DT_DATORD = MOVD.DT_DATORD
			                        AND COMI.NR_SEQORD = MOVD.NR_SEQORD
			                        AND COMI.NR_SUBSEQ = MOVD.NR_SUBSEQ
			                        AND MOVD.CD_CLIENTE = CLIBOL.CD_CLIENTE ");

                sql.AppendLine(string.Format("AND {0}", new Sinacor.Servico.Bovespa.Acesso.ResourceAccess.Acesso().ConsultarListaAssessores("CLIBOL.CD_ASSESSOR", 0, 9999999)));

                this.DataBase.AddInParameter(command, "DataPregao2", DbType.DateTime, entity.DataPregao);

                //Filtros Opcionais
                if (!string.IsNullOrEmpty(entity.Ativo))
                {
                    sql.AppendLine("AND RTRIM(NEGVEN.COD_NEG) = RTRIM(:Ativo2) ");
                    this.DataBase.AddInParameter(command, "Ativo2", DbType.String, entity.Ativo);
                }

                if (entity.Negocio.HasValue)
                {
                    sql.AppendLine("AND NEGVEN.NUM_NEG = :Negocio2 ");
                    this.DataBase.AddInParameter(command, "Negocio2", DbType.Int32, entity.Negocio);
                }

                if (entity.ExcluirDiscricionariasDist.HasValue
                    && entity.ExcluirDiscricionariasDist.Value)
                {
                    sql.AppendLine("AND INSTR(MOVD.TP_ORDEM, '4', 1, 1) = 0 AND MOVD.IN_DISTRIB <> 'N' ");
                }

                if (entity.IncluirNegociosCancelados.HasValue
                    && entity.IncluirNegociosCancelados.Value)
                {
                    sql.AppendLine(@"UNION ALL 
                                     SELECT
                                        NEGCAN.DT_DATORD DataOrdem,
			                            NEGCAN.NR_SEQORD Ordem,
			                            NEGCAN.NR_SUBSEQ SequenciaOrdem,
			                            NEGCAN.CD_NEGOCIO Ativo,
			                            NEGCAN.CD_NATOPE NaturezaOperacao,
			                            NEGCAN.NR_NEGOCIO Negocio,
			                            0 DigitoNegocio,
			                            NEGCAN.DT_PREGAO DataNegocio,
			                            NEGCAN.QT_QTDESP Quantidade,
			                            NEGCAN.CD_BOLSAMOV Bolsa,
			                            NEGCAN.DT_DATMOV DataMovimento,
			                            NEGCAN.CD_CLIENTE CodigoCliente,
			                            0 DigitoCliente,
			                            0 CodigoClienteBroker,
			                            0 DigitoClienteBroker,
			                            0 CodigoClienteFinanceiro,
			                            0 DigitoClienteFinanceiro,
			                            0 CodigoCarteiraLiquidacao,
			                            0 PercentualReducaoAcrescimo,
			                            'N' GerouRegistro,
			                            NEGCAN.VL_NEGOCIO Preco,
			                            NVL(NEGCAN.COD_USUA_FIM, 0) UsuarioDirecionado,
			                            NVL(NEGCAN.COD_CLI_FIM, 0) ClienteDirecionado,
			                            NEGCAN.CD_CONTRAPARTE Contraparte,
			                            NEGD.CD_OPERA_MEGA Porta,
			                            (SELECT CD_LOGIN FROM TGEUSUARIO WHERE CD_USUARIO = MOVD.CD_USUARIO) Operador,
			                            CLIBOL.CD_CPFCGC CNPJCPF,
			                            NULL Apelido,
			                            NULL QuantidadeNegocio,
			                            'S' Cancelado,
			                            NVL2((SELECT NUM_PRTA_INIC_FAIX FROM TBOCTRL_PRTA_OCOR_ZECZE CONTPOR WHERE NEGD.CD_OPERA_MEGA 
                                        BETWEEN CONTPOR.NUM_PRTA_INIC_FAIX AND CONTPOR.NUM_PRTA_FIM_FAIX), 'S', 'N') ControlePorta,
			                            NEGD.HH_NEGOCIO HoraNegocio,
			                            NEGCAN.IN_HOME HomeBroker,
			                            NEGD.IN_ORINEG Origem,
			                            NEGD.TP_MERCADO Mercado,
			                            NULL IndicadorCorrespondente,
                                        NULL QuantidadeDiferenteNegocio,
                                        NEGD.CD_CODCAS CodigoCasamento 
                                     FROM 
                                        TORNEGCAN NEGCAN,
			                            TSCCLIBOL CLIBOL,
			                            TORMOVD MOVD,
			                            TORNEGD NEGD 
                                     WHERE 
                                        NEGCAN.DT_PREGAO = :DataPregao3
			                            AND NEGCAN.CD_CLIENTE = CLIBOL.CD_CLIENTE
			                            AND NEGCAN.DT_DATORD = MOVD.DT_DATORD
			                            AND NEGCAN.NR_SEQORD = MOVD.NR_SEQORD
			                            AND NEGCAN.NR_SUBSEQ = MOVD.NR_SUBSEQ
			                            AND NEGCAN.CD_BOLSAMOV = NEGD.CD_BOLSAMOV
			                            AND NEGCAN.DT_PREGAO = NEGD.DT_PREGAO
			                            AND NEGCAN.CD_NEGOCIO = NEGD.CD_NEGOCIO
			                            AND NEGCAN.NR_NEGOCIO = NEGD.NR_NEGOCIO
			                            AND NEGCAN.CD_NATOPE = NEGD.CD_NATOPE ");

                    sql.AppendLine(string.Format("AND {0}", new Sinacor.Servico.Bovespa.Acesso.ResourceAccess.Acesso().ConsultarListaAssessores("CLIBOL.CD_ASSESSOR", 0, 9999999)));

                    this.DataBase.AddInParameter(command, "DataPregao3", DbType.DateTime, entity.DataPregao);
                }

                sql.AppendLine(@"ORDER BY CodigoCliente, Ativo, Negocio, NaturezaOperacao");

                command.CommandText = sql.ToString();

                try
                {
                    listaOcorrencia = this.FindAll<BusinessEntity.Ocorrencia>(command, reader => new BusinessEntity.Ocorrencia
                    {  
                        DataOrdem = reader.GetValue<DateTime?>("DataOrdem"),
                        Ordem = (reader["Ordem"] != DBNull.Value ? reader.GetValue<int?>("Ordem") : 0),
                        SequenciaOrdem = reader.GetValue<Int32?>("SequenciaOrdem"),
                        Ativo = reader.GetValue<String>("Ativo"),
                        NaturezaOperacao = EnumConverter.Parse<BusinessEntity.Enum.NaturezaOperacao>(reader.GetValue<String>("NaturezaOperacao")),
                        Negocio = reader.GetValue<Int32>("Negocio"),
                        DigitoNegocio = reader.GetValue<Byte>("DigitoNegocio"),
                        DataNegocio = reader.GetValue<DateTime>("DataNegocio"),
                        Quantidade = reader.GetValue<Decimal>("Quantidade"),
                        Bolsa = reader.GetValue<String>("Bolsa"),
                        DataMovimento = reader.GetValue<DateTime>("DataMovimento"),
                        CodigoCliente = reader.GetValue<Int32>("CodigoCliente"),
                        DigitoCliente = reader.GetValue<Byte>("DigitoCliente"),
                        CodigoClienteBroker = reader.GetValue<Int32>("CodigoClienteBroker"),
                        DigitoClienteBroker = reader.GetValue<Byte>("DigitoClienteBroker"),
                        CodigoClienteFinanceiro = reader.GetValue<Int32>("CodigoClienteFinanceiro"),
                        DigitoClienteFinanceiro = reader.GetValue<Byte>("DigitoClienteFinanceiro"),
                        CodigoCarteiraLiquidacao = reader.GetValue<Int16>("CodigoCarteiraLiquidacao"),
                        PercentualReducaoAcrescimo = reader.GetValue<Decimal>("PercentualReducaoAcrescimo"),
                        GerouRegistro = reader.GetValue<String>("GerouRegistro"),
                        Preco = (reader["Preco"] != DBNull.Value ? reader.GetValue<int?>("Preco") : 0),                        
                        UsuarioDirecionado = reader.GetValue<Int32?>("UsuarioDirecionado"),
                        ClienteDirecionado = reader.GetValue<String>("ClienteDirecionado"),
                        Contraparte = reader.GetValue<Int32?>("Contraparte"),
                        Porta = reader.GetValue<Int32?>("Porta"),
                        Operador = reader.GetValue<String>("Operador"),
                        CNPJCPF = reader.GetValue<Int64>("CNPJCPF"),                       
                        Apelido = reader.GetValue<String>("Apelido"),                      
                        QuantidadeNegocio = reader.GetValue<Decimal?>("QuantidadeNegocio"),                          
                        Cancelado = reader.GetValue<String>("Cancelado") == "S",
                        ControlePorta = reader.GetValue<String>("ControlePorta") == "S",
                        HoraNegocio = reader.GetValue<String>("HoraNegocio"),
                        HomeBroker = reader.GetValue<String>("HomeBroker") == "S",
                        Origem = reader.GetValue<String>("Origem"),
                        Mercado = EnumConverter.Parse<BusinessEntity.Enum.TipoMercado>(reader.GetValue<String>("Mercado")),                                                                        
                        IndicadorCorrespondente = reader.GetValue<String>("IndicadorCorrespondente") == "S",                       
                        QuantidadeDiferenteNegocio = reader.GetValue<String>("QuantidadeDiferenteNegocio") == "S",
                        CodigoCasamento = reader.GetValue<String>("CodigoCasamento")
                    });

                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

            return listaOcorrencia;
        }
        #endregion

        #region ConsultarOcorrenciasSinacor
        /// <summary>
        /// Disponibiliza uma lista de ocorrencias que caracterizem Ze com Ze.
        /// </summary>
        /// <param name="entity"></param>
        public List<BusinessEntity.Ocorrencia> ConsultarOcorrenciasSinacor(BusinessEntity.Parameter.FiltroOcorrenciaSinacor entity)
        {
            StringBuilder sql = new StringBuilder();
            List<BusinessEntity.Ocorrencia> listaOcorrencia = null;

            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                sql.AppendLine(@"SELECT DataOrdem, CodigoCliente, Ordem, SequenciaOrdem, 
                                        Ativo, Preco, NaturezaOperacao, Negocio, 
                                        DataNegocio, SUM(Quantidade) Quantidade, Bolsa, 
                                        DataMovimento, DigitoCliente, CodigoClienteBroker, DigitoClienteBroker, 
                                        CodigoClienteFinanceiro, DigitoClienteFinanceiro, CodigoCarteiraLiquidacao, 
                                        PercentualReducaoAcrescimo, PercentualReducaoAcrescimo, UsuarioDirecionado, 
                                        ClienteDirecionado, Contraparte, Porta, Operador, CNPJCPF, Apelido, 
                                        QuantidadeNegocio, Cancelado, ControlePorta, HoraNegocio, HomeBroker, 
                                        Origem, Mercado, IndicadorCorrespondente, QuantidadeDiferenteNegocio,
                                        CodigoCasamento

                                 FROM   (SELECT VCOMI12.DT_DATORD DataOrdem,
                                                VCOMI12.CD_CLIENTE CodigoCliente,
                                                VCOMI12.NR_SEQORD Ordem,
                                                VCOMI12.NR_SUBSEQ SequenciaOrdem,
                                                VCOMI12.CD_NEGOCIO Ativo,
                                                VCOMI12.VL_NEGOCIO Preco,
                                                VCOMI12.CD_NATOPE NaturezaOperacao,
                                                VCOMI12.NR_NEGOCIO Negocio,
                                                VCOMI12.DT_NEGOCIO DataNegocio,
                                                LEAST(VCOMI12.QT_QTDESP, AUX.QT_QTDESP) Quantidade,
                                                VCOMI12.CD_BOLSAMOV Bolsa,
                                                VCOMI12.DT_DATMOV DataMovimento,
                                                VCOMI12.DV_CLIENTE DigitoCliente,
                                                VCOMI12.CD_CLIENTE_BRO CodigoClienteBroker,
                                                VCOMI12.DV_CLIENTE_BRO DigitoClienteBroker,
                                                VCOMI12.CD_CLIENTE_FIN CodigoClienteFinanceiro,
                                                VCOMI12.DV_CLIENTE_FIN DigitoClienteFinanceiro,
                                                VCOMI12.CD_CARLIQ CodigoCarteiraLiquidacao,
                                                VCOMI12.PC_REDACR PercentualReducaoAcrescimo,
                                                VCOMI12.CD_USUFIM UsuarioDirecionado,
                                                VCOMI12.CD_CLIFIM ClienteDirecionado,
                                                VCOMI12.CD_CONTRAPARTE Contraparte,
                                                VCOMI12.CD_OPERA_MEGA Porta,
                                                VCOMI12.CD_LOGIN Operador,
                                                VCOMI12.CD_CPFCGC CNPJCPF,
                                                VCOMI12.NM_APELIDO Apelido,
                                                VCOMI12.QT_NEGOCIO QuantidadeNegocio,
                                                'N' Cancelado,
                                                NVL2((SELECT NUM_PRTA_INIC_FAIX FROM TBOCTRL_PRTA_OCOR_ZECZE CONTPOR WHERE VCOMI12.CD_OPERA_MEGA BETWEEN CONTPOR.NUM_PRTA_INIC_FAIX AND CONTPOR.NUM_PRTA_FIM_FAIX), 'S', 'N') ControlePorta,
                                                VCOMI12.HH_NEGOCIO HoraNegocio,
                                                VCOMI12.IN_HOMEBROKER HomeBroker,
                                                VCOMI12.IN_ORINEG Origem,
                                                VCOMI12.TP_MERCADO Mercado,
                                                VCOMI12.IN_CORRESP IndicadorCorrespondente,
                                                'N' QuantidadeDiferenteNegocio,
                                                VCOMI12.CD_CODCAS CodigoCasamento                                               
                                         FROM 
                                                V_TORCOMI12 VCOMI12, 
                                                V_TORCOMI12 AUX 
                                         WHERE 
                                                VCOMI12.DT_NEGOCIO = :DataPregao
                                                AND VCOMI12.CD_BOLSAMOV = AUX.CD_BOLSAMOV
                                                AND VCOMI12.DT_NEGOCIO = AUX.DT_NEGOCIO
                                                AND VCOMI12.NR_NEGOCIO = AUX.NR_NEGOCIO
                                                AND VCOMI12.CD_NEGOCIO = AUX.CD_NEGOCIO
                                                AND VCOMI12.CD_CPFCGC = AUX.CD_CPFCGC
                                                AND VCOMI12.DT_NASC_FUND = AUX.DT_NASC_FUND
                                                AND VCOMI12.CD_CON_DEP = AUX.CD_CON_DEP
                                                AND DECODE(VCOMI12.CD_NATOPE,'C','V','V','C') = AUX.CD_NATOPE
                                                AND VCOMI12.IN_CORRESP = 'N'
                                                AND AUX.IN_CORRESP = 'N' ");

                this.DataBase.AddInParameter(command, "DataPregao", DbType.DateTime, entity.DataPregao);
                // CodigoCliente
                if (entity.CodigoCliente.HasValue)
                {
                    sql.AppendLine("AND VCOMI12.CD_CLIENTE = :CodigoCliente ");
                    this.DataBase.AddInParameter(command, "CodigoCliente", DbType.Int32, entity.CodigoCliente);
                }
                // Ativo
                if (!string.IsNullOrEmpty(entity.Ativo))
                {
                    sql.AppendLine("AND VCOMI12.CD_NEGOCIO = :Ativo ");
                    this.DataBase.AddInParameter(command, "Ativo", DbType.String, entity.Ativo);
                }
                // Preco
                if (entity.Preco.HasValue)
                {
                    sql.AppendLine("AND VCOMI12.VL_NEGOCIO = :Preco ");
                    this.DataBase.AddInParameter(command, "Preco", DbType.Decimal, entity.Preco);
                }
                // Exclui Discricionaria
                if (entity.ExcluirDiscricionariasDist.Value)
                {
                    sql.AppendLine("AND INSTR(VCOMI12.TP_ORDEM, '4', 1, 1) = 0 AND VCOMI12.IN_DISTRIB <> 'N' ");
                }
                // Lista de Assessores
                sql.AppendLine(string.Format("AND {0} )", new Sinacor.Servico.Bovespa.Acesso.ResourceAccess.Acesso().ConsultarListaAssessores("VCOMI12.CD_ASSESSOR", 0, 9999999)));

                sql.AppendLine(@"GROUP BY 
                                        DataOrdem, CodigoCliente, Ordem, SequenciaOrdem, 
                                        Ativo, Preco, NaturezaOperacao, Negocio, DataNegocio,
                                        Bolsa, DataMovimento, DigitoCliente, CodigoClienteBroker,
                                        DigitoClienteBroker, CodigoClienteFinanceiro, DigitoClienteFinanceiro, CodigoCarteiraLiquidacao, 
                                        PercentualReducaoAcrescimo, PercentualReducaoAcrescimo, UsuarioDirecionado, ClienteDirecionado,
                                        Contraparte, Porta, Operador, CNPJCPF, Apelido, 
                                        QuantidadeNegocio, Cancelado, ControlePorta, HoraNegocio, 
                                        HomeBroker, Origem, Mercado, IndicadorCorrespondente, QuantidadeDiferenteNegocio,
                                        CodigoCasamento
                                 ORDER BY 
                                        CodigoCliente, Negocio, Ativo, NaturezaOperacao, Ordem");              

                command.CommandText = sql.ToString();

                listaOcorrencia = this.FindAll<BusinessEntity.Ocorrencia>(command, reader => new BusinessEntity.Ocorrencia
                { 
                    Apelido = reader.GetValue<String>("Apelido"),
                    Ativo = reader.GetValue<String>("Ativo"),
                    Bolsa = reader.GetValue<String>("Bolsa"),
                    Cancelado = reader.GetValue<String>("Cancelado") == "S",
                    ClienteDirecionado = reader.GetValue<String>("ClienteDirecionado"),
                    CNPJCPF = reader.GetValue<Int64>("CNPJCPF"),
                    CodigoCarteiraLiquidacao = reader.GetValue<Int16>("CodigoCarteiraLiquidacao"),
                    CodigoCliente = reader.GetValue<Int32>("CodigoCliente"),
                    CodigoClienteBroker = reader.GetValue<Int32>("CodigoClienteBroker"),
                    CodigoClienteFinanceiro = reader.GetValue<Int32>("CodigoClienteFinanceiro"),
                    Contraparte = reader.GetValue<Int32?>("Contraparte"),
                    ControlePorta = reader.GetValue<String>("ControlePorta") == "S",
                    DataMovimento = reader.GetValue<DateTime>("DataMovimento"),
                    DataNegocio = reader.GetValue<DateTime>("DataNegocio"),
                    DataOrdem = reader.GetValue<DateTime?>("DataOrdem"),
                    DigitoCliente = reader.GetValue<Byte>("DigitoCliente"),
                    DigitoClienteBroker = reader.GetValue<Byte>("DigitoClienteBroker"),
                    DigitoClienteFinanceiro = reader.GetValue<Byte>("DigitoClienteFinanceiro"),
                    HomeBroker = reader.GetValue<String>("HomeBroker") == "S",
                    HoraNegocio = reader.GetValue<String>("HoraNegocio"),
                    IndicadorCorrespondente = reader.GetValue<String>("IndicadorCorrespondente") == "S",
                    Mercado = EnumConverter.Parse<BusinessEntity.Enum.TipoMercado>(reader.GetValue<String>("Mercado")),
                    NaturezaOperacao = EnumConverter.Parse<BusinessEntity.Enum.NaturezaOperacao>(reader.GetValue<String>("NaturezaOperacao")),
                    Negocio = reader.GetValue<Int32>("Negocio"),
                    Operador = reader.GetValue<String>("Operador"),
                    Ordem = reader.GetValue<Int32?>("Ordem"),
                    Origem = reader.GetValue<String>("Origem"),
                    PercentualReducaoAcrescimo = reader.GetValue<Decimal>("PercentualReducaoAcrescimo"),
                    Porta = reader.GetValue<Int32?>("Porta"),
                    Preco = reader.GetValue<Decimal?>("Preco"),
                    Quantidade = reader.GetValue<Decimal>("Quantidade"),
                    QuantidadeDiferenteNegocio = reader.GetValue<String>("QuantidadeDiferenteNegocio") == "S",
                    QuantidadeNegocio = reader.GetValue<Decimal?>("QuantidadeNegocio"),
                    SequenciaOrdem = reader.GetValue<Int32?>("SequenciaOrdem"),
                    UsuarioDirecionado = reader.GetValue<Int32?>("UsuarioDirecionado"),
                    CodigoCasamento = reader.GetValue<String>("CodigoCasamento")
                });
            }

            return listaOcorrencia;
        }
        #endregion

        #region ConsultarOrdensCasadasNegocio
        /// <summary>
        /// Identifica Ordens casadas com o Negocio.
        /// </summary>
        /// <param name="entity"></param>
        public List<Ordens.BusinessEntity.Parameter.CancelarOrdemDistribuida> ConsultarOrdensCasadasNegocio(BusinessEntity.Ocorrencia entity)
        {
            StringBuilder sql = new StringBuilder();
            List<Ordens.BusinessEntity.Parameter.CancelarOrdemDistribuida> listaCancelarOrdemDistribuida = null;

            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                sql.AppendLine(@"SELECT COMI.CD_CLIENTE CodigoFilhote, 
                                        COMI.DT_DATORD DataOrdem, 
                                        COMI.DT_DATMOV DataPregao, 
                                        DISCONJ.NR_CONJUNTO NumeroConjunto,
                                        COMI.NR_SEQORD NumeroOrdem,
                                        COMI.NR_SUBSEQ NumeroOrdemSubSequencia, 
                                        'T' TipoCancelamento, 
                                        'L' TipoDistribuicao 
                                 FROM 
                                        TORCOMI COMI, 
                                        TORDISCONJ DISCONJ, 
                                        TORMOVD MOVD 
                                 WHERE 
                                        COMI.NR_NEGOCIO = :Negocio 
                                        AND COMI.DT_DATMOV = :DataNegocio
                                        AND COMI.DT_DATORD = DISCONJ.DT_DATORD 
                                        AND COMI.NR_SEQORD = DISCONJ.NR_SEQORD 
                                        AND COMI.NR_SUBSEQ = DISCONJ.NR_SUBSEQ 
                                        AND COMI.DT_DATMOV = DISCONJ.DT_PREGAO 
                                        AND COMI.NR_SEQORD = MOVD.NR_SEQORD 
                                        AND COMI.DT_DATORD = MOVD.DT_DATORD 
                                        AND COMI.NR_SUBSEQ = MOVD.NR_SUBSEQ ");

                this.DataBase.AddInParameter(command, "Negocio", DbType.Int32, entity.Negocio);
                this.DataBase.AddInParameter(command, "DataNegocio", DbType.DateTime, entity.DataNegocio);

                command.CommandText = sql.ToString();

                listaCancelarOrdemDistribuida = this.FindAll<Ordens.BusinessEntity.Parameter.CancelarOrdemDistribuida>(command, reader => new Ordens.BusinessEntity.Parameter.CancelarOrdemDistribuida
                {
                    CodigoFilhote = reader.GetValue<Int32>("CodigoFilhote"),
                    DataOrdem = reader.GetValue<DateTime>("DataOrdem"),
                    DataPregao = reader.GetValue<DateTime>("DataPregao"),
                    NumeroConjunto = reader.GetValue<Int32>("NumeroConjunto"),
                    NumeroOrdem = reader.GetValue<Int32>("NumeroOrdem"),
                    NumeroOrdemSubSequencia = reader.GetValue<Int32>("NumeroOrdemSubSequencia"),
                    TipoCancelamento = reader.GetValue<String>("TipoCancelamento"),
                    TipoDistribuicao = reader.GetValue<String>("TipoDistribuicao")
                });
            }

            return listaCancelarOrdemDistribuida;
        }
        #endregion

        #region ConsultarSolucaoNegocio
        /// <summary>
        /// Disponibiliza uma lista de Ordens de Negocios para solucao.
        /// </summary>
        /// <param name="entity"></param>
        public List<BusinessEntity.NegocioAlocacaoProprietaria> ConsultarSolucaoNegocio(BusinessEntity.Parameter.FiltroSolucaoNegocio entity)
        {
            StringBuilder sql = new StringBuilder();
            List<BusinessEntity.NegocioAlocacaoProprietaria> listaNegocioAlocacaoProprietaria = null;

            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                sql.AppendLine(@"SELECT COMI.DT_DATORD DataOrdem, 
                                        COMI.NR_SEQORD Ordem, 
                                        COMI.NR_SUBSEQ SequenciaOrdem, 
                                        COMI.CD_NEGOCIO Ativo, 
                                        COMI.CD_NATOPE NaturezaOperacao, 
                                        COMI.NR_NEGOCIO Negocio,
                                        COMI.DV_NEGOCIO DigitoNegocio, 
                                        COMI.DT_NEGOCIO DataNegocio, 
                                        COMI.QT_QTDESP Quantidade,
                                        COMI.CD_BOLSAMOV Bolsa, 
                                        COMI.DT_DATMOV DataMovimento, 
                                        COMI.CD_CLIENTE CodigoCliente,
                                        COMI.DV_CLIENTE DigitoCliente,
                                        COMI.CD_CLIENTE_BRO CodigoClienteBroker, 
                                        COMI.DV_CLIENTE_BRO DigitoClienteBroker,
                                        COMI.CD_CLIENTE_FIN CodigoClienteFinanceiro, 
                                        COMI.DV_CLIENTE_FIN DigitoClienteFinanceiro, 
                                        COMI.CD_CARLIQ CodigoCarteiraLiquidacao, 
                                        COMI.PC_REDACR PercentualReducaoAcrescimo, 
                                        COMI.IN_ORIGER GerouRegistro, 
                                        NEGD.VL_NEGOCIO Preco 
                                 FROM 
                                        TORCOMI COMI, 
                                        TORNEGD NEGD 
                                 WHERE 
                                        COMI.DT_NEGOCIO = TO_DATE(:DataNegocio,'DD/MM/YYYY')
                                        AND COMI.CD_NATOPE = :NaturezaOperacao 
                                        AND (COMI.CD_NEGOCIO = :Ativo OR NEGD.CD_CODCAS = :CodigoCasamento)
                                        AND NEGD.VL_NEGOCIO = :Preco 
                                        AND COMI.NR_NEGOCIO <> :Negocio 
                                        AND COMI.CD_CLIENTE <> :CodigoCliente 
                                        AND COMI.CD_BOLSAMOV = NEGD.CD_BOLSAMOV 
                                        AND COMI.DT_NEGOCIO = NEGD.DT_PREGAO 
                                        AND COMI.CD_NEGOCIO = NEGD.CD_NEGOCIO 
                                        AND COMI.NR_NEGOCIO = NEGD.NR_NEGOCIO 
                                        AND COMI.CD_NATOPE = NEGD.CD_NATOPE 
                                        AND COMI.DT_NEGOCIO >= (SELECT MIN(DT_MOV) FROM TBOCALE) 
                                        AND NEGD.DT_MOVIMENTO >= (SELECT MIN(DT_MOV) FROM TBOCALE) 
                                        AND COMI.IN_CORRESP = 'N'
                                        AND NEGD.TP_MERCADO IN ('VIS','FRA','OPC','OPV') 
                                 ORDER BY 
                                        COMI.QT_QTDESP, COMI.NR_NEGOCIO ");

                this.DataBase.AddInParameter(command, "DataNegocio", DbType.String, entity.DataNegocio.Day + "/" + entity.DataNegocio.Month + "/" + entity.DataNegocio.Year);
                this.DataBase.AddInParameter(command, "NaturezaOperacao", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.NaturezaOperacao>(entity.NaturezaOperacao));
                this.DataBase.AddInParameter(command, "Ativo", DbType.String, entity.Ativo);
                this.DataBase.AddInParameter(command, "Preco", DbType.Decimal, entity.Preco);
                this.DataBase.AddInParameter(command, "Negocio", DbType.Int32, entity.Negocio);
                this.DataBase.AddInParameter(command, "CodigoCliente", DbType.Int32, entity.CodigoCliente);
                this.DataBase.AddInParameter(command, "CodigoCasamento", DbType.String, entity.CodigoCasamento);

                command.CommandText = sql.ToString();

                listaNegocioAlocacaoProprietaria = this.FindAll<BusinessEntity.NegocioAlocacaoProprietaria>(command, reader => new BusinessEntity.NegocioAlocacaoProprietaria
                {
                    Ativo = (reader["Ativo"] != DBNull.Value ? reader.GetValue<String>("Ativo") : String.Empty),
                    Bolsa = (reader["Bolsa"] != DBNull.Value ? reader.GetValue<String>("Bolsa") : String.Empty),
                    CodigoCarteiraLiquidacao = reader.GetValue<Int16>("CodigoCarteiraLiquidacao"),
                    CodigoCliente = reader.GetValue<Int32>("CodigoCliente"),
                    CodigoClienteBroker = reader.GetValue<Int32>("CodigoClienteBroker"),
                    CodigoClienteFinanceiro = reader.GetValue<Int32>("CodigoClienteFinanceiro"),
                    DataMovimento = reader.GetValue<DateTime>("DataMovimento"),
                    DataNegocio = reader.GetValue<DateTime>("DataNegocio"),
                    DataOrdem = (DateTime?)reader.GetValue<DateTime>("DataOrdem"),
                    DigitoCliente = reader.GetValue<Byte>("DigitoCliente"),
                    DigitoClienteBroker = reader.GetValue<Byte>("DigitoClienteBroker"),
                    DigitoClienteFinanceiro = reader.GetValue<Byte>("DigitoClienteFinanceiro"),
                    GerouRegistro = (reader["GerouRegistro"] != DBNull.Value ? reader.GetValue<String>("GerouRegistro") : String.Empty),
                    NaturezaOperacao = EnumConverter.Parse<BusinessEntity.Enum.NaturezaOperacao>(reader.GetValue<String>("NaturezaOperacao")),
                    Negocio = reader.GetValue<Int32>("Negocio"),
                    DigitoNegocio = reader.GetValue<Byte>("DigitoNegocio"),
                    Ordem = (reader["Ordem"] != DBNull.Value ? (Int32?)reader.GetValue<Int32>("Ordem") : 0),
                    PercentualReducaoAcrescimo = reader.GetValue<Decimal>("PercentualReducaoAcrescimo"),
                    Preco = (reader["Preco"] != DBNull.Value ? (Decimal?)reader.GetValue<Decimal>("Preco") : null),
                    Quantidade = (reader["Quantidade"] != DBNull.Value ? reader.GetValue<Decimal>("Quantidade") : 0),
                    SequenciaOrdem = (reader["SequenciaOrdem"] != DBNull.Value ? reader.GetValue<Int32>("SequenciaOrdem") : 0)
                });
            }

            return listaNegocioAlocacaoProprietaria;
        }
        #endregion

        #region ExcluirCorrespondenteNegocio
        /// <summary>
        /// Exclui registros correspondentes do Negocio informado da tabela TORCOMI.
        /// </summary>
        /// <param name="entity"></param>
        public Int32 ExcluirCorrespondenteNegocio(BusinessEntity.Ocorrencia entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine(@"DELETE FROM TORCOMI 
                             WHERE DT_NEGOCIO = :DataNegocio
                                   AND NR_NEGOCIO = :Negocio 
                                   AND CD_NATOPE = :NaturezaOperacao 
                                   AND CD_NEGOCIO = :Ativo                                   
                                   AND CD_CLIENTE = :CodigoCliente
                                   AND IN_CORRESP = 'S'                                   
                                   AND CD_BOLSAMOV = :Bolsa");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "DataNegocio", DbType.DateTime, entity.DataNegocio);
                this.DataBase.AddInParameter(command, "Negocio", DbType.Int32, entity.Negocio);
                this.DataBase.AddInParameter(command, "NaturezaOperacao", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.NaturezaOperacao>(entity.NaturezaOperacao));
                this.DataBase.AddInParameter(command, "Ativo", DbType.String, entity.Ativo);                
                this.DataBase.AddInParameter(command, "CodigoCliente", DbType.Int32, entity.CodigoCliente);
                this.DataBase.AddInParameter(command, "Bolsa", DbType.String, entity.Bolsa);                    

                return this.DataBase.ExecuteNonQuery(command);
            }
        }
        #endregion

        #region ExcluirExecucao
        /// <summary>
        /// Exclui Negocio informado da tabela TOREXEC.
        /// </summary>
        /// <param name="entity"></param>
        public Int32 ExcluirExecucao(BusinessEntity.NegocioAlocacaoProprietaria entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine(@"DELETE FROM TOREXEC 
                             WHERE DT_NEGOCIO = :DataNegocio
                                   AND NR_NEGOCIO = :Negocio 
                                   AND CD_NATOPE = :NaturezaOperacao 
                                   AND CD_NEGOCIO = :Ativo                                   
                                   AND DT_DATORD = :DataOrdem                                   
                                   AND NR_SEQORD = :Ordem                                   			
                                   AND NR_SUBSEQ = :SequenciaOrdem
                                   AND CD_BOLSAMOV = :Bolsa");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "DataNegocio", DbType.DateTime, entity.DataNegocio);
                this.DataBase.AddInParameter(command, "Negocio", DbType.Int32, entity.Negocio);
                this.DataBase.AddInParameter(command, "NaturezaOperacao", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.NaturezaOperacao>(entity.NaturezaOperacao));
                this.DataBase.AddInParameter(command, "Ativo", DbType.String, entity.Ativo);
                this.DataBase.AddInParameter(command, "DataOrdem", DbType.DateTime, entity.DataOrdem);
                if (entity.Ordem.HasValue) this.DataBase.AddInParameter(command, "Ordem", DbType.Int32, entity.Ordem);
                if (entity.SequenciaOrdem.HasValue) this.DataBase.AddInParameter(command, "SequenciaOrdem", DbType.Int32, entity.SequenciaOrdem);
                this.DataBase.AddInParameter(command, "Bolsa", DbType.String, entity.Bolsa);

                return this.DataBase.ExecuteNonQuery(command);
            }
        }
        #endregion

        #region ExcluirMovimentoNegocio
        /// <summary>
        /// Exclui Negocios do Movimento da tabela TORNEGD.
        /// </summary>
        /// <param name="entity"></param>
        public Int32 ExcluirMovimentoNegocio(BusinessEntity.Ocorrencia entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine(@"DELETE FROM TORNEGD 
                             WHERE NR_NEGOCIO = :Negocio 
                                   AND CD_NEGOCIO = :Ativo 
                                   AND CD_NATOPE = :NaturezaOperacao 
                                   AND DT_PREGAO = :DataMovimento 
                                   AND CD_BOLSAMOV = :Bolsa");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "Negocio", DbType.Int32, entity.Negocio);
                this.DataBase.AddInParameter(command, "Ativo", DbType.String, entity.Ativo);
                this.DataBase.AddInParameter(command, "NaturezaOperacao", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.NaturezaOperacao>(entity.NaturezaOperacao));
                this.DataBase.AddInParameter(command, "DataMovimento", DbType.DateTime, entity.DataMovimento);
                this.DataBase.AddInParameter(command, "Bolsa", DbType.String, entity.Bolsa);

                return this.DataBase.ExecuteNonQuery(command);
            }
        }
        #endregion

        #region ExcluirNegocio
        /// <summary>
        /// Exclui Negocio informado da tabela TORCOMI.
        /// </summary>
        /// <param name="entity"></param>
        public Int32 ExcluirNegocio(BusinessEntity.NegocioAlocacaoProprietaria entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine(@"DELETE FROM TORCOMI 
                             WHERE DT_NEGOCIO = :DataNegocio
                                   AND NR_NEGOCIO = :Negocio 
                                   AND CD_NATOPE = :NaturezaOperacao 
                                   AND CD_NEGOCIO = :Ativo                                   
                                   AND DT_DATORD = :DataOrdem                                   
                                   AND NR_SEQORD = :Ordem                                   			
                                   AND NR_SUBSEQ = :SequenciaOrdem
                                   AND CD_BOLSAMOV = :Bolsa");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "DataNegocio", DbType.DateTime, entity.DataNegocio);
                this.DataBase.AddInParameter(command, "Negocio", DbType.Int32, entity.Negocio);
                this.DataBase.AddInParameter(command, "NaturezaOperacao", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.NaturezaOperacao>(entity.NaturezaOperacao));
                this.DataBase.AddInParameter(command, "Ativo", DbType.String, entity.Ativo);
                this.DataBase.AddInParameter(command, "DataOrdem", DbType.DateTime, entity.DataOrdem);
                if (entity.Ordem.HasValue) this.DataBase.AddInParameter(command, "Ordem", DbType.Int32, entity.Ordem);
                if (entity.SequenciaOrdem.HasValue) this.DataBase.AddInParameter(command, "SequenciaOrdem", DbType.Int32, entity.SequenciaOrdem);
                this.DataBase.AddInParameter(command, "Bolsa", DbType.String, entity.Bolsa);

                return this.DataBase.ExecuteNonQuery(command);
            }
        }
        #endregion

        #region IncluirExecucao
        /// <summary>
        /// Inclui Negocio informado na tabela TOREXEC.
        /// </summary>
        /// <param name="entity"></param>
        public Int32 IncluirExecucao(BusinessEntity.NegocioAlocacaoProprietaria entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine(@"INSERT INTO TOREXEC 
                             (
                                DT_HOREXE, 
                                DT_DATORD,
                                NR_SEQORD,
                                NR_SUBSEQ, 
                                DT_NEGOCIO,
                                NR_NEGOCIO,
                                CD_NATOPE,
                                VL_NEGOCIO,
                                QT_NEGOCIO,
                                TP_ORIGEM,
                                NM_RESUSUA,
                                DT_DATMOV,
                                NR_SEQDET,
                                CD_BOLSAMOV,
                                CD_NEGOCIO,
                                DT_SISTEMA
                             )
                             VALUES 
                             (
                                SYSDATE,
                                :DataOrdem,
                                :Ordem,
                                :SequenciaOrdem,
                                :DataNegocio,
                                :Negocio,
                                :NaturezaOperacao,
                                :Preco,
                                :Quantidade,
                                'Z', 
                                'ZEcomZE',
                                :DataMovimento,
                                0,
                                :Bolsa,
                                :Ativo,
                                CURRENT_TIMESTAMP
                             )");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "DataOrdem", DbType.DateTime, entity.DataOrdem);
                if (entity.Ordem.HasValue) this.DataBase.AddInParameter(command, "Ordem", DbType.Int32, entity.Ordem);
                if (entity.SequenciaOrdem.HasValue) this.DataBase.AddInParameter(command, "SequenciaOrdem", DbType.Int32, entity.SequenciaOrdem);
                this.DataBase.AddInParameter(command, "DataNegocio", DbType.DateTime, entity.DataNegocio);
                this.DataBase.AddInParameter(command, "Negocio", DbType.Int32, entity.Negocio);
                this.DataBase.AddInParameter(command, "NaturezaOperacao", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.NaturezaOperacao>(entity.NaturezaOperacao));
                if (entity.Preco.HasValue) this.DataBase.AddInParameter(command, "Preco", DbType.Decimal, entity.Preco);
                this.DataBase.AddInParameter(command, "Quantidade", DbType.Decimal, entity.Quantidade);
                this.DataBase.AddInParameter(command, "DataMovimento", DbType.DateTime, entity.DataMovimento);
                this.DataBase.AddInParameter(command, "Bolsa", DbType.String, entity.Bolsa);
                this.DataBase.AddInParameter(command, "Ativo", DbType.String, entity.Ativo);

                return this.DataBase.ExecuteNonQuery(command);
            }
        }
        #endregion

        #region IncluirLogNegocioCancelado
        /// <summary>
        /// Inclui Log do negocio cancelado.
        /// </summary>
        /// <param name="entity"></param>
        public Int32 IncluirLogNegocioCancelado(BusinessEntity.Ocorrencia entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine(@"INSERT INTO TORNEGCAN 
                             (
                                CD_BOLSAMOV,
                                DT_PREGAO,
                                CD_NATOPE,
                                CD_NEGOCIO,
                                NR_NEGOCIO,
                                DT_DATMOV,
                                HH_NEGOCIO,
                                QT_NEGOCIO,
                                VL_NEGOCIO,
                                DT_DATORD,
                                NR_SEQORD,
                                NR_SUBSEQ,
                                CD_CLIENTE,
                                IN_HOME,
                                IN_ORIGEM,
                                QT_QTDESP,
                                CD_CONTRAPARTE,
                                TMST_ATLZ,
                                NOME_TMNL_CANC_NEG,
                                IND_CANC_ZECZE,
                                COD_USUA_FIM,
                                COD_CLI_FIM
                             )
                             VALUES 
                             (
                                :Bolsa,
                                :DataNegocio,
                                :NaturezaOperacao,
                                :Ativo,
                                :Negocio,
                                :DataMovimento,
                                :HoraNegocio,
                                :QuantidadeNegocio,
                                :Preco,
                                :DataOrdem,
                                :Ordem,
                                :SequenciaOrdem,
                                :CodigoCliente,
                                :HomeBroker,
                                :Origem,
                                :Quantidade,
                                :Contraparte,
                                CURRENT_TIMESTAMP,
                                :ClientHost,
                                'S',
                                :UsuarioDirecionado,
                                :ClienteDirecionado
                             )");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "Bolsa", DbType.String, entity.Bolsa);
                this.DataBase.AddInParameter(command, "DataNegocio", DbType.DateTime, entity.DataNegocio);
                this.DataBase.AddInParameter(command, "NaturezaOperacao", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.NaturezaOperacao>(entity.NaturezaOperacao));
                this.DataBase.AddInParameter(command, "Ativo", DbType.String, entity.Ativo);
                this.DataBase.AddInParameter(command, "Negocio", DbType.Int32, entity.Negocio);
                this.DataBase.AddInParameter(command, "DataMovimento", DbType.DateTime, entity.DataMovimento);
                this.DataBase.AddInParameter(command, "HoraNegocio", DbType.String, entity.HoraNegocio);
                if (entity.QuantidadeNegocio.HasValue) this.DataBase.AddInParameter(command, "QuantidadeNegocio", DbType.Decimal, entity.QuantidadeNegocio);
                if (entity.Preco.HasValue) this.DataBase.AddInParameter(command, "Preco", DbType.Decimal, entity.Preco);
                this.DataBase.AddInParameter(command, "DataOrdem", DbType.DateTime, entity.DataOrdem);
                if (entity.Ordem.HasValue) this.DataBase.AddInParameter(command, "Ordem", DbType.Int32, entity.Ordem);
                if (entity.SequenciaOrdem.HasValue) this.DataBase.AddInParameter(command, "SequenciaOrdem", DbType.Int32, entity.SequenciaOrdem); 
                this.DataBase.AddInParameter(command, "CodigoCliente", DbType.Int32, entity.CodigoCliente);
                this.DataBase.AddInParameter(command, "HomeBroker", DbType.String, (bool)entity.HomeBroker?"S":"N");
                this.DataBase.AddInParameter(command, "Origem", DbType.String, entity.Origem);
                this.DataBase.AddInParameter(command, "Quantidade", DbType.Decimal, entity.Quantidade);
                this.DataBase.AddInParameter(command, "Contraparte", DbType.Int32, entity.Contraparte);
                this.DataBase.AddInParameter(command, "ClientHost", DbType.String, AuthorizationContext.Current.ClientHost.Ip);
                this.DataBase.AddInParameter(command, "UsuarioDirecionado", DbType.Int32, entity.UsuarioDirecionado);
                this.DataBase.AddInParameter(command, "ClienteDirecionado", DbType.String, entity.ClienteDirecionado);

                return this.DataBase.ExecuteNonQuery(command);
            }
        }
        #endregion

        #region IncluirNegocio
        /// <summary>
        /// Inclui negocio na tabela TORCOMI.
        /// </summary>
        /// <param name="entity"></param>
        public Int32 IncluirNegocio(BusinessEntity.NegocioAlocacaoProprietaria entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine(@"INSERT INTO TORCOMI 
                             (
                                DT_DATORD, NR_SEQORD, NR_SUBSEQ,
                                DT_NEGOCIO, CD_BOLSAMOV, NR_NEGOCIO,
                                DV_NEGOCIO, CD_NATOPE, CD_CLIENTE,
                                DV_CLIENTE, CD_CLIENTE_BRO, DV_CLIENTE_BRO,
                                CD_CLIENTE_FIN, DV_CLIENTE_FIN, QT_QTDESP,
                                CD_CARLIQ, PC_REDACR, IN_CORRESP,
                                CD_NEGOCIO, CD_CORRESP, DT_DATMOV,
                                NR_SEQCOMI, NM_USUARIO, DT_SISTEMA,
                                IN_ORIGER
                             )
                             VALUES 
                             (
                                :DataOrdem, :Ordem, :SequenciaOrdem,
                                :DataNegocio, :Bolsa, :Negocio,
                                :DigitoNegocio, :NaturezaOperacao, :CodigoCliente,
                                :DigitoCliente, :CodigoClienteBroker, :DigitoClienteBroker,
                                :CodigoClienteFinanceiro, :DigitoClienteFinanceiro, :Quantidade,
                                :CodigoCarteiraLiquidacao, :PercentualReducaoAcrescimo, 'N',
                                :Ativo, 0, (SELECT DT_DATMOV FROM TORDATMOV),
                                POR_UTIL.FOR_BUSCASEQCOMI(0), :UserId, CURRENT_TIMESTAMP,
                                'SERVICO.BOVESPA.ALOCACAO.IALOCACAOPROPRIETARIA'
                             )");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "DataOrdem", DbType.DateTime, entity.DataOrdem);
                if (entity.Ordem.HasValue) this.DataBase.AddInParameter(command, "Ordem", DbType.Int32, entity.Ordem);
                if (entity.SequenciaOrdem.HasValue) this.DataBase.AddInParameter(command, "SequenciaOrdem", DbType.Int32, entity.SequenciaOrdem);
                this.DataBase.AddInParameter(command, "DataNegocio", DbType.DateTime, entity.DataNegocio);
                this.DataBase.AddInParameter(command, "Bolsa", DbType.String, entity.Bolsa);
                this.DataBase.AddInParameter(command, "Negocio", DbType.Int32, entity.Negocio);
                this.DataBase.AddInParameter(command, "DigitoNegocio", DbType.Int32, entity.DigitoNegocio);
                this.DataBase.AddInParameter(command, "NaturezaOperacao", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.NaturezaOperacao>(entity.NaturezaOperacao));
                this.DataBase.AddInParameter(command, "CodigoCliente", DbType.Int32, entity.CodigoCliente);
                this.DataBase.AddInParameter(command, "DigitoCliente", DbType.Byte, entity.DigitoCliente);
                this.DataBase.AddInParameter(command, "CodigoClienteBroker", DbType.Int32, entity.CodigoClienteBroker);
                this.DataBase.AddInParameter(command, "DigitoClienteBroker", DbType.Byte, entity.DigitoClienteBroker);
                this.DataBase.AddInParameter(command, "CodigoClienteFinanceiro", DbType.Int32, entity.CodigoClienteFinanceiro);
                this.DataBase.AddInParameter(command, "DigitoClienteFinanceiro", DbType.Byte, entity.DigitoClienteFinanceiro);
                this.DataBase.AddInParameter(command, "Quantidade", DbType.Decimal, entity.Quantidade);
                this.DataBase.AddInParameter(command, "CodigoCarteiraLiquidacao", DbType.Int16, entity.CodigoCarteiraLiquidacao);
                this.DataBase.AddInParameter(command, "PercentualReducaoAcrescimo", DbType.Decimal, entity.PercentualReducaoAcrescimo);
                this.DataBase.AddInParameter(command, "Ativo", DbType.String, entity.Ativo);
                this.DataBase.AddInParameter(command, "UserId", DbType.Int32, AuthorizationContext.Current.UserId);

                return this.DataBase.ExecuteNonQuery(command);
            }
        }
        #endregion

        #endregion
    }
}